#ifndef PROMESA_H_INCLUDED
#define PROMESA_H_INCLUDED

//#include "auxiliares.h"


#include <iostream>
#include <string>

using namespace std;

typedef unsigned int Nat;
typedef string Nombre;
typedef unsigned int Dinero;
typedef bool TipoPromesa;

class Promesa{

    public:

    Promesa();
    /*Constructor por de Promesa*/
    Promesa(Nombre, TipoPromesa ,Dinero, Nat);

    /*Destructor de Promesa*/
    ~Promesa();

    ///OBSERVADORES///
	/*devuele el nombre del titulo*/
    const Nombre& titulo()const;
	/*devuele el tipo de Promesa*/
    TipoPromesa tipo();
	/*devuele el limite de dinero de la Promesa*/
    Nat limite();
    /*devuele la cantidad de acciones de la Promesa*/
    Nat cantidad();

	///FUNCION PARA MOSTRAR POR PANTALLA//
    /*muestra la Promesa por pantalla*/
    ostream & operator<<(ostream &os) const;

    void mostrar(ostream & os)const;

    ///IGUALDAD OBSERVACIONAL///

    bool operator==(const Promesa& otro) const;
	bool operator!=(const Promesa& otro) const;
    //ASIGNACION
    Promesa& operator=(const Promesa&);

	private:

    Nombre titulo_;
    Dinero limite_;
    Nat cantidad_;
    TipoPromesa tipo_;


};

Promesa::Promesa(Nombre n, TipoPromesa t,Dinero d, Nat c){
	titulo_ = n;
	tipo_ = t;
	limite_ = d;
	cantidad_ = c;
}

Promesa::~Promesa(){

}

Promesa::Promesa(){

}

const Nombre& Promesa::titulo()const{

	return titulo_;
}


TipoPromesa Promesa::tipo(){

    return tipo_;
}

Nat Promesa::limite(){

    return limite_;
}
Nat Promesa::cantidad(){

    return cantidad_;
}
//~

bool Promesa::operator==(const Promesa& otro) const {

    bool res;
    res = (titulo_== otro.titulo_) && (tipo_== otro.tipo_) && (cantidad_== otro.cantidad_);
    res = res  && (limite_== otro.limite_);
    return res;
}

bool Promesa::operator!=(const Promesa& otro) const {

    bool res;
    res = !((titulo_== otro.titulo_) && (tipo_== otro.tipo_) && (cantidad_== otro.cantidad_) && (limite_== otro.limite_));
    return res;
}

Promesa& Promesa::operator=(const Promesa& otro) {


    this->cantidad_ = otro.cantidad_;
    this->tipo_ = otro.tipo_;
    this->titulo_ = otro.titulo_;
    this->limite_ = otro.limite_;

    return *this;
}

void Promesa::mostrar(ostream &os)const{

	string t="";
	if (tipo_){
		t="COMPRA"; //compra
	}else{
		t="VENTA"; //false
	}
	os<< "|Titulo:" << titulo_ << ", limite:" << limite_ << ", tipo: " << t << ", Cant: " << cantidad_ <<"|"<< endl;

}

ostream & Promesa::operator<<(ostream &os) const{
    mostrar(os);
    return os;
}

ostream& operator<<(ostream& out, const Promesa& a){
	a.mostrar(out);
	return out;
};


#endif // Promesa_H_INCLUDED
